/*
 * =============================================================================
 * Copyright© by Benjamin Sempere,
 * All rights reserved.
 * =============================================================================
 * Author  : Benjamin Sempere
 * E-mail  : benjamin@sempere.org
 * Homepage: www.sempere.org
 * =============================================================================
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package org.sempere.gwt.toolbox.core.client.view;

import org.sempere.gwt.toolbox.core.client.common.Observable;
import org.sempere.gwt.toolbox.core.client.view.helper.ViewHelper;

import com.google.gwt.user.client.ui.Widget;

public abstract class AbstractView implements View {

	private Widget widget;
	private ViewHelper viewHelper;

	/**
	 * Default class constructor (without helper)
	 */

	public AbstractView() {
	}

	/**
	 * Class constructor that takes the helper to bind to this view
	 * 
	 * @param helper the helper for this view
	 */
	public AbstractView(ViewHelper helper) {
		if (helper == null) {
			throw new IllegalArgumentException("The helper cannot be null.");
		}

		this.viewHelper = helper;
		this.viewHelper.setView(this);
	}

	/**
	 * Get the widget associated to this view<br>
	 * If the widget does not exist, one will be created
	 */
	public Widget getWidget() {
		if (this.widget == null) {
			this.widget = this.createWidget();
		}

		return this.widget;
	}

	/**
	 * Create the widget associated to this view
	 */
	protected abstract Widget createWidget();

	public ViewHelper getViewHelper() {
		return this.viewHelper;
	}

	public void setViewHelper(ViewHelper viewHelper) {
		this.viewHelper = viewHelper;
	}

	public String getLocateeName() {
		return this.getViewName();
	}

	public final String getObserverName() {
		return this.getViewName();
	}

	public void update(Observable observable) {
		this.update(observable, null);
	}

	protected void setWidget(Widget widget) {
		this.widget = widget;
	}
}